From: emellor@ewan Date: Fri, 30 Sep 2005 10:40:59 +0000 (+0100) Subject: Remove the bizarre arrangement whereby EventChannel inherits from dict. Move X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~16763^2~71 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22Dat/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22Dat?a=commitdiff_plain;h=1b19d438d2ee5511b40c3e538437596f63d50527;p=xen.git Remove the bizarre arrangement whereby EventChannel inherits from dict. Move the channel-creation logic into eventChannel, making the EventChannel class simpler. Remove the closeEventChannel method -- it was simply doing a check for None, and that isn't enough value to justify the extra method when there is an EventChannel.close method there too. Signed-off-by: Ewan Mellor --- diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 45c0b2be44..6a3757693c 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -32,7 +32,7 @@ import errno import xen.lowlevel.xc from xen.util.blkif import blkdev_uname_to_file -from xen.xend.server.channel import EventChannel +from xen.xend.server import channel from xen.xend import image from xen.xend import scheduler @@ -1032,7 +1032,7 @@ class XendDomainInfo: except: # if anything goes wrong, assume the port was not yet set pass - ret = EventChannel.interdomain(0, self.domid, port1=port, port2=0) + ret = channel.eventChannel(0, self.domid, port1=port, port2=0) self.storeDom(path, ret.port1) return ret diff --git a/tools/python/xen/xend/image.py b/tools/python/xen/xend/image.py index 8f0c1c6a7b..0e71568c1d 100644 --- a/tools/python/xen/xend/image.py +++ b/tools/python/xen/xend/image.py @@ -358,7 +358,8 @@ class VmxImageHandler(ImageHandler): return vncconnect def destroy(self): - channel.eventChannelClose(self.device_channel) + if self.device_channel: + self.device_channel.close() import signal if not self.pid: return diff --git a/tools/python/xen/xend/server/channel.py b/tools/python/xen/xend/server/channel.py index a34e31fbb2..095a14786a 100755 --- a/tools/python/xen/xend/server/channel.py +++ b/tools/python/xen/xend/server/channel.py @@ -13,59 +13,42 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #============================================================================ # Copyright (C) 2004, 2005 Mike Wray +# Copyright (C) 2005 XenSource Ltd #============================================================================ -import threading -import select - -import xen.lowlevel.xc; xc = xen.lowlevel.xc.new() +import xen.lowlevel.xc from xen.xend.XendLogging import log -DEBUG = 0 -RESPONSE_TIMEOUT = 20.0 +xc = xen.lowlevel.xc.new() + -class EventChannel(dict): +class EventChannel: """An event channel between domains. """ - def interdomain(cls, dom1, dom2, port1=0, port2=0): - """Create an event channel between domains. - - @return EventChannel (None on error) - """ - v = xc.evtchn_bind_interdomain(dom1=dom1, dom2=dom2, - port1=port1, port2=port2) - if v: - v = cls(dom1, dom2, v) - return v - - interdomain = classmethod(interdomain) - - def __init__(self, dom1, dom2, d): - d['dom1'] = dom1 - d['dom2'] = dom2 - self.update(d) + def __init__(self, dom1, dom2, port1, port2): self.dom1 = dom1 self.dom2 = dom2 - self.port1 = d.get('port1') - self.port2 = d.get('port2') + self.port1 = port1 + self.port2 = port2 + def close(self): - """Close the event channel. + """Close the event channel. Nothrow guarantee. """ def evtchn_close(dom, port): try: xc.evtchn_close(dom=dom, port=port) - except Exception, ex: - pass + except Exception: + log.exception("Exception closing event channel %d, %d.", dom, + port) - if DEBUG: - print 'EventChannel>close>', self evtchn_close(self.dom1, self.port1) evtchn_close(self.dom2, self.port2) + def sxpr(self): return ['event-channel', ['dom1', self.dom1 ], @@ -74,19 +57,20 @@ class EventChannel(dict): ['port2', self.port2 ] ] + def __repr__(self): return ("" % (self.dom1, self.port1, self.dom2, self.port2)) -def eventChannel(dom1, dom2, port1=0, port2=0): + +def eventChannel(dom1, dom2, port1 = 0, port2 = 0): """Create an event channel between domains. @return EventChannel (None on error) """ - return EventChannel.interdomain(dom1, dom2, port1=port1, port2=port2) - -def eventChannelClose(evtchn): - """Close an event channel. - """ - if not evtchn: return - evtchn.close() + v = xc.evtchn_bind_interdomain(dom1=dom1, dom2=dom2, + port1=port1, port2=port2) + if v and v.get('port1'): + return EventChannel(dom1, dom2, v['port1'], v['port2']) + else: + return None